package com.jms.web.mvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.regex.Pattern;

/**
 * 通用处理器拦截器抽象类
 * 提供基于URL模式匹配的拦截功能，子类需要实现getValidateUri方法来定义需要拦截的URI模式
 */
public abstract class GeneralHandlerInterceptor implements HandlerInterceptor {

    private Pattern[] patterns;

    /**
     * 获取需要验证的URI数组
     * 子类必须实现此方法，返回需要拦截的URI模式数组
     * @return URI模式字符串数组，支持通配符*匹配
     */
    protected abstract String[] getValidateUri();

    /**
     * 获取编译后的模式数组
     * 将getValidateUri返回的URI模式字符串转换为正则表达式Pattern对象数组
     * 通配符*会被替换为正则表达式中的.*进行匹配
     * @return 编译后的Pattern对象数组
     */
    private Pattern[] getPatterns() {
        if (patterns == null) {
            String[] validateUri = getValidateUri();
            if (validateUri != null && validateUri.length > 0) {
                patterns = new Pattern[validateUri.length];
                for (int i = 0; i < validateUri.length; i++) {
                    // 将通配符*替换为正则表达式中的.*模式
                    validateUri[i] = validateUri[i].replaceAll("\\*", ".*");
                    patterns[i] = Pattern.compile(validateUri[i]);
                }
            } else {
                patterns = new Pattern[0];
            }
        }
        return patterns;
    }

    /**
     * 拦截动作处理方法
     * 根据请求URL与预定义模式进行匹配，判断是否需要拦截该请求
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @param handler 处理器对象
     * @return true表示需要拦截，false表示不需要拦截
     */
    public boolean interceptAction(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String requestUrl = request.getRequestURI();
        // 遍历所有模式，检查请求URL是否匹配任一模式
        for (Pattern pattern : getPatterns()) {
            if (pattern.matcher(requestUrl).matches()) {
                return true;
            }
        }
        return false;
    }
}

